package es.udc.acs.utils;


import es.udc.acs.parser.ParserMensaje;

public class FormateadorDatos {
	
	public static void formatearMensaje(String mensaje,boolean subcabecera) {

		String tipo = ParserMensaje.obtenerTipo(mensaje);
		
		if(tipo.equals(CodigosFAP.CM_C_PD_CONSULTAR_SALDO)){
			FormateadorDatos.mostrarConsultaSaldo(mensaje, subcabecera, true);
		} else if (tipo.equals(CodigosFAP.CM_C_PD_CONSULTAR_MOVIMIENTOS)) {
			FormateadorDatos.mostrarConsultaMovimientos(mensaje, subcabecera, true);
		} else if (tipo.equals(CodigosFAP.CM_C_PD_REINTEGRO)) {
			FormateadorDatos.mostrarReintegro(mensaje, subcabecera, true);
		} else if (tipo.equals(CodigosFAP.CM_C_PD_ABONO)) {
			FormateadorDatos.mostrarAbono(mensaje, subcabecera,true);
		} else if (tipo.equals(CodigosFAP.CM_C_PD_TRASPASO)) {
			FormateadorDatos.mostrarTraspaso(mensaje, subcabecera, true);
		} else if(tipo.equals(CodigosFAP.CM_B_RD_CONSULTAR_SALDO)){
			FormateadorDatos.mostrarConsultaSaldo(mensaje, subcabecera, false);
		} else if (tipo.equals(CodigosFAP.CM_B_RD_CONSULTAR_MOVIMIENTOS)) {
			FormateadorDatos.mostrarConsultaMovimientos(mensaje, subcabecera, false);
		} else if (tipo.equals(CodigosFAP.CM_B_RD_REINTEGRO)) {
			FormateadorDatos.mostrarReintegro(mensaje, subcabecera, false);
		} else if (tipo.equals(CodigosFAP.CM_B_RD_ABONO)) {
			FormateadorDatos.mostrarAbono(mensaje, subcabecera,false);
		} else if (tipo.equals(CodigosFAP.CM_B_RD_TRASPASO)) {
			FormateadorDatos.mostrarTraspaso(mensaje, subcabecera, false);
		} else {
			System.out.println("Mensaje no reconocido:"+mensaje);
		}
	}

	
	public static void mostrarConsultaSaldo(String mensaje, 
			                                boolean subcabecera,
			                                boolean solicitud) {
		
		String codRes = obtenerCodRes(mensaje,subcabecera,solicitud);
		String cuerpo = obtenerCuerpo(mensaje,subcabecera,solicitud); 
		
		System.out.println("-----------------------------------");
		System.out.println("Consulta de saldo");
		System.out.println("-----------------------------------");
		
		mostrarCabecera(mensaje,codRes,solicitud);
		mostrarSubCabecera(mensaje,subcabecera);
		
		if (solicitud) {
			System.out.println("Numero tajeta: "+ParserMensaje.obtenerNumTarjeta(cuerpo));
			System.out.println("Numero cuenta: "+ParserMensaje.obtenerNumCuenta(cuerpo));			
		}else {
			if (codRes.equals(CodigosFAP.CE_CORRECTO)) {		
				System.out.println("Signo: "+ParserMensaje.obtenerSigno(cuerpo));
				System.out.println("Saldo: "+ParserMensaje.obtenerSaldo(cuerpo));
			}
		}
	}
	
	
	public static void mostrarConsultaMovimientos(String mensaje, 
			                                      boolean subcabecera,
					                              boolean solicitud) {
		
		String codRes = obtenerCodRes(mensaje,subcabecera,solicitud);
		String cuerpo = obtenerCuerpo(mensaje,subcabecera,solicitud); 
		
		System.out.println("-----------------------------------");
		System.out.println("Consulta de Movimientos");
		System.out.println("-----------------------------------");
		
		mostrarCabecera(mensaje,codRes,solicitud);
		mostrarSubCabecera(mensaje,subcabecera);
			
		if (solicitud) {
			System.out.println("Numero tajeta: "+ParserMensaje.obtenerNumTarjeta(cuerpo));
			System.out.println("Numero cuenta: "+ParserMensaje.obtenerNumCuenta(cuerpo));			
		}else {
			if (codRes.equals(CodigosFAP.CE_CORRECTO)) {	
				int numMov = Integer.parseInt(ParserMensaje.obtenerNumMov(cuerpo));
				
				for (int i = 0; i < numMov; i++) {
					
					System.out.println("Movimiento "+i+":");
					System.out.println("\tTipo: "+
							CodigosFAP.obtenerNombreMovimiento(ParserMensaje.obtenerTipoMov(cuerpo,i)));
					System.out.println("\tSigno: "+ParserMensaje.obtenerSignoMov(cuerpo,i));
					System.out.println("\tImporte: "+ParserMensaje.obtenerImporteMov(cuerpo,i));
					System.out.println("\tFecha: "+ParserMensaje.obtenerFechaMov(cuerpo,i)	);
					System.out.println("\tHora: "+ParserMensaje.obtenerHoraMov(cuerpo,i));				
				}
			}
		}
	}
	
	
	public static void mostrarReintegro(String mensaje, 
			                            boolean subcabecera,
			                            boolean solicitud) {
		
		String codRes = obtenerCodRes(mensaje,subcabecera,solicitud);
		
		System.out.println("-----------------------------------");
		System.out.println("Reintegro");
		System.out.println("-----------------------------------");
		
		mostrarCabecera(mensaje,codRes,solicitud);
		mostrarSubCabecera(mensaje,subcabecera);
			
		try {
			String cuerpo = obtenerCuerpo(mensaje,subcabecera,solicitud); 	
			
			if (solicitud) {
				System.out.println("Numero tarjeta: "+ParserMensaje.obtenerNumTarjeta(cuerpo));
				System.out.println("Numero cuenta: "+ParserMensaje.obtenerNumCuenta(cuerpo));	
				System.out.println("Importe: "+ParserMensaje.obtenerImporte(cuerpo));
			}else {
				if (codRes.equals(CodigosFAP.CE_CORRECTO)) {
					System.out.println("Signo: "+ParserMensaje.obtenerSigno(cuerpo));
					System.out.println("Saldo: "+ParserMensaje.obtenerSaldo(cuerpo));
				}
			}
		} catch (Exception e) {
			System.out.println("La operacion ha sido offline");
		}
	}

	
	public static void mostrarAbono(String mensaje, 
			                        boolean subcabecera,
		                            boolean solicitud) {
		
		String codRes = obtenerCodRes(mensaje,subcabecera,solicitud);
		
		System.out.println("-----------------------------------");
		System.out.println("Abono");
		System.out.println("-----------------------------------");
		
		mostrarCabecera(mensaje,codRes,solicitud);
		mostrarSubCabecera(mensaje,subcabecera);
			
		try {
			String cuerpo = obtenerCuerpo(mensaje,subcabecera,solicitud); 	
		
			if (solicitud) {
				System.out.println("Numero tarjeta: "+ParserMensaje.obtenerNumTarjeta(cuerpo));
				System.out.println("Numero cuenta: "+ParserMensaje.obtenerNumCuenta(cuerpo));	
				System.out.println("Importe: "+ParserMensaje.obtenerImporte(cuerpo));
			}else {
				if (codRes.equals(CodigosFAP.CE_CORRECTO)) {
					System.out.println("Signo: "+ParserMensaje.obtenerSigno(cuerpo));
					System.out.println("Saldo: "+ParserMensaje.obtenerSaldo(cuerpo));
				}
			}
		} catch (Exception e) {
			System.out.println("La operacion ha sido offline");
		}
	}

	
	public static void mostrarTraspaso(String mensaje, 
			                           boolean subcabecera,
			                           boolean solicitud) {
		
		String codRes = obtenerCodRes(mensaje,subcabecera,solicitud);
		
		System.out.println("-----------------------------------");
		System.out.println("Traspaso");
		System.out.println("-----------------------------------");
		
		mostrarCabecera(mensaje,codRes,solicitud);
		mostrarSubCabecera(mensaje,subcabecera);
			
		try {
			String cuerpo = obtenerCuerpo(mensaje,subcabecera,solicitud); 	
		
			if (solicitud) {
				System.out.println("Numero tarjeta origen: "+ParserMensaje.obtenerNumTarjeta(cuerpo));
				System.out.println("Numero cuenta origen: "+ParserMensaje.obtenerNumCuenta(cuerpo));
				System.out.println("Numero cuenta destino: "+ParserMensaje.obtenerNumCuentaD(cuerpo));	
				System.out.println("Importe: "+ParserMensaje.obtenerImporteTraspaso(cuerpo));
			}else {
				if (codRes.equals(CodigosFAP.CE_CORRECTO)) {
					System.out.println("Signo origen: "+ParserMensaje.obtenerSigno(cuerpo));
					System.out.println("Saldo origen: "+ParserMensaje.obtenerSaldo(cuerpo));
					
					System.out.println("Signo destino: "+ParserMensaje.obtenerSignoT(cuerpo));
				    System.out.println("Saldo destino: "+ParserMensaje.obtenerSaldoT(cuerpo));
				}	
			}
			} catch (Exception e) {
			System.out.println("La operacion ha sido offline");
		}
	}
	
	
	private static String obtenerCuerpo(String mensaje,
			                            boolean subcabecera,
			                            boolean solicitud) {
		
		if (solicitud) { // solicitud
			if (subcabecera) {
				return ParserMensaje.obtenerCuerpoSub(mensaje);
			}else {
				return ParserMensaje.obtenerCuerpo(mensaje); 
			}
		}
		else {           // respuesta
			if (subcabecera) {
				return ParserMensaje.obtenerCuerpoSubCRes(mensaje);
			}else {
				return ParserMensaje.obtenerCuerpoCResCajero(mensaje); 
			}
		}
	}
	
	
	private static String obtenerCodRes(String mensaje,
                                        boolean subcabecera,
                                        boolean solicitud) {

		if (!solicitud) { // en caso de que sea una respuesta
			if (subcabecera) {
				return ParserMensaje.obtenerCodRes(mensaje);
			}else {
				return ParserMensaje.obtenerCodResCajero(mensaje); 
			}
		}
		return null;
	}


	private static void mostrarCabecera(String mensaje,
			                            String codRes,
			                            boolean solicitud) {
		
		String origen  = ParserMensaje.obtenerOrigen(mensaje);
		String destino = ParserMensaje.obtenerDestino(mensaje);
		String tipo    = ParserMensaje.obtenerTipo(mensaje);		
		
		String tipoM = "Solicitud";
		if (!solicitud) tipoM = "Respuesta";
		
		System.out.println(tipoM+" con origen "+origen+" a destino "+destino+".");
		System.out.println("Tipo de mensaje: "+CodigosFAP.obtenerNombreCodigo(tipo));
		if (!solicitud) {
			System.out.println("Codido de respuesta: "+CodigosFAP.obtenerNombreRespuesta(codRes));	
		}
	}

	
	private static void mostrarSubCabecera(String mensaje,
			                               boolean subcabecera) {

		if (subcabecera) {
			String sub = ParserMensaje.obtenerSubcabecera(mensaje);
	
			String canal      = ParserMensaje.obtenerCanal(sub);
			String numMensaje = ParserMensaje.obtenerNumMensaje(sub);
			String online     = ParserMensaje.obtenerCodOnline(sub);
			
			System.out.println("Numero de canal: "+canal);
			System.out.println("Numero de mensaje: "+numMensaje);
			System.out.println("Codigo on-line: "+online);
		}
	}


}
